package entity

const (
	NodeTemplateKindApproval  = 1
	NodeTemplateKindCondition = 2
)

// ApprovalStrategy 审批策略类型
type ApprovalStrategy string

// 审批策略枚举
const (
	// ApprovalStrategyOr 或批策略：任意一人通过即可通过，任意一人拒绝即拒绝
	ApprovalStrategyOr ApprovalStrategy = "OR"
	// ApprovalStrategyAnd 与批策略：所有人通过才能通过，任意一人拒绝即拒绝
	ApprovalStrategyAnd ApprovalStrategy = "AND"
)

type NodeTemplate struct {
	ID   string `json:"id"`
	Name string `json:"name"`
	// NextNodeTemplateID 下一个节点的id
	// 如果Kind=2，则NextNodeTemplateID为空，下一个节点的跳转信息记录在Conditions中
	NextNodeTemplateID string `json:"nextNodeTemplateID"`
	// Kind 节点类型，1:审批类型节点，2:条件类型节点
	Kind int `json:"kind"`
	// WorkflowTemplateID 所属工作流模板的ID
	WorkflowTemplateID string `json:"workflowTemplateId"`
	// ApprovalStrategy 审批策略，空值或OR表示或批，AND表示与批
	ApprovalStrategy ApprovalStrategy `json:"approvalStrategy"`
	// BusinessParams 业务参数
	BusinessParams string `json:"businessParams"`

	// Conditions 条件
	Conditions []expression `json:"conditions"`
}

// expression 表达式，用来记录条件成立后的跳转
type expression struct {
	// Param 参数
	Param string `json:"param"`

	// Operator 操作符
	// 1: 等于
	// 2: 不等于
	Operator int `json:"operator"`

	// Value 值
	Value any `json:"value"`

	// NextNodeTemplateID 条件成立后跳转的节点id
	NextNodeTemplateID string `json:"nextNodeTemplateId"`
}

func (n NodeTemplate) IsLastNodeOfWorkflow() bool {
	return n.NextNodeTemplateID == ""
}

// GetApprovalStrategy 获取审批策略，默认为或批
func (n NodeTemplate) GetApprovalStrategy() ApprovalStrategy {
	if n.ApprovalStrategy == "" {
		return ApprovalStrategyOr
	}
	return n.ApprovalStrategy
}

// IsOrApproval 是否为或批策略
func (n NodeTemplate) IsOrApproval() bool {
	return n.GetApprovalStrategy() == ApprovalStrategyOr
}

// IsAndApproval 是否为与批策略
func (n NodeTemplate) IsAndApproval() bool {
	return n.GetApprovalStrategy() == ApprovalStrategyAnd
}

// NewNodeTemplate 创建节点模板实体的工厂方法
func NewNodeTemplate(nodeTemplateID, name, nextNodeTemplateID string, kind int, workflowTemplateID string) NodeTemplate {
	return NodeTemplate{
		ID:                 nodeTemplateID,
		Name:               name,
		NextNodeTemplateID: nextNodeTemplateID,
		Kind:               kind,
		WorkflowTemplateID: workflowTemplateID,
		ApprovalStrategy:   ApprovalStrategyOr, // 默认为或批
		Conditions:         nil,                // 初始化为空，根据需要设置条件
	}
}

// GetApprovalNodeTemplateID 审批节点的id
// 条件类型的节点，会计算条件是否满足，而推导出下一个节点的id。
// 如果返回为空， 则说明出现配置问题
func (n NodeTemplate) GetApprovalNodeTemplateID(conditionParams ConditionParams) string {
	// 1、如果是审批类型节点，直接返回NextNodeTemplateID
	// 2、如果是条件类型节点，遍历所有条件，找到第一个满足的条件，返回NextNodeTemplateID

	// 如果是审批类型节点，直接返回NextNodeTemplateID
	if n.IsApprovalNode() {
		return n.ID
	}

	// 如果是条件类型节点，遍历所有条件，找到第一个满足的条件，返回NextNodeTemplateID
	for _, condition := range n.Conditions {
		paramValue := conditionParams[condition.Param]

		switch condition.Operator {
		case 1: // 等于
			if paramValue == condition.Value {
				return condition.NextNodeTemplateID
			}
		case 2: // 不等于
			if paramValue != condition.Value {
				return condition.NextNodeTemplateID
			}
		}
	}

	// 如果没有满足的条件，返回空字符串
	return ""
}

func (n NodeTemplate) IsApprovalNode() bool {
	return n.Kind == NodeTemplateKindApproval
}
